#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <ctype.h>
char **do_parse(char *buffer)//这就是C语言的魅力
{
    static char *tem[32];
    char *cur = buffer;
    int argc = 0;
    while (*cur != '\0')
    {
        if (!isspace(*cur))
        {
            tem[argc++] = cur;
            while (!isspace(*cur) && (*cur) != '\0')
            {
                cur++;
            }
        }
        else
        {
            while (isspace(*cur))
            {
                *cur = '\0';
                cur++;
            }
        }
    }
    tem[argc] = NULL;
    return tem;
}
int main()
{
    char buffer[] = "ls -a -l";
    char **argv = do_parse(buffer);
    for (int i = 0; i < 4; i++)
    {
        std::cout<<argv[i]<<std::endl;
    }
    return 0;
}

// const int MAX = 1024;
// char order[MAX];

// int get_order()
// {
//     memset(order, 0X00, MAX); // void *memset(void *s, int c, size_t n);
//     printf("minshell$");
//     fflush(stdout);
//     //[^\n]：一个格式说明符：告诉scanf：读取一个字符串直到遇到换行符'\n'为止，[^\n]:^表示非，表示匹配除换行符之外的任何字符序列
//     //%*c :高数scanf，读取一个字符，*号表示不会被存储到任何变量中
//     if (scanf("%[^\n]%*c", order) == 0)
//     {
//         getchar(); // 消耗换行符
//         return -1;
//     }
//     return 1;
// }

// char** do_parse(char* buffer)//作用是buffer指向空间中的空白字符用'\0'填充，
// {
//     int argc = 0;
//     static char * argv[32];//argv中存放的是char* 类型
//     char * ptr = buffer;
//     while(*ptr != '\0')
//     {
//         if(!isspace(*ptr))//*ptr不为空字符
//         {
//             argv[argc++] = ptr;
//             while(!isspace(*ptr)&&(*ptr)!= '\0')//当*ptr不是空字符并且不是'\0'时，ptr++，
//             {
//                 ptr++;
//             }
//         }
//         else{
//             while(isspace(*ptr))
//             {
//                 *ptr = '\0';
//                 ptr++;
//             }
//         }
//     }
//     argv[argc] = NULL;
//     return argv;
// }
// int do_excute(char *buffer)
// {
//     char** argv = {NULL};
//     int pid = fork();
//     if(pid == 0)
//     {
//         //子进程
//         argv = do_parse(buffer);
//         if(argv[0]== NULL)
//         {
//             exit(-1);
//         }
//         execvp(argv[0],argv);
//     }
//     else
//     {
//         waitpid(pid,NULL,0);
//     }
//     return 0;
// }
// int main()
// {
//     while (1)
//     {
//         if (get_order() < 0)
//         {
//             continue;
//         }
//         do_excute(order);
//     }
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //child
//         int cnt = 5;
//         while(cnt--)
//         {
//             sleep(1);
//             std::cout<<"I am child process"<<std::endl;
//         }
//         exit(1);
//     }
//     //father;
//     int sum = 10;
//     while(sum--)
//     {
//         sleep(1);
//         std::cout<<"I am father process "<<std::endl;
//     }
//     return 0;
// }

// #include <stdio.h>
// #include <unistd.h>
// #include <iostream>
// #include <sys/types.h>
// #include <sys/wait.h>

// int main()
// {
//     pid_t id = fork();
//     if (id < 0)
//     {
//         std::cout << "fork() error " << std::endl;
//         exit(0);
//     }
//     if (id > 0)
//     {
//         // father
//         std::cout << "father process id : " << getpid() << std::endl;
//         sleep(8);
//         int status;

//         int ret = waitpid(-1, &status, 0);
//         if ( ret > 0 && ( status & 0X7F ) == 0 ){ // 正常退出
//             printf("child exit code:%d\n", (status>>8)&0XFF);
//         }
//     }
//     if (id == 0)
//     {
//         // child
//         std::cout << "child process id : " << getpid() << std::endl;
//         int cnt = 5;
//         while (cnt--)
//         {
//             std::cout << "i am child process " << std::endl;
//             sleep(1);
//         }
//         exit(1);
//     }
//     return 0;
// }

// int main()
//    {
//       int a = 0;
//       a++;
//       execl("/usr/bin/pwd", "pwd", NULL);
//       printf("%d\n", a++);
//    }
// #include <unistd.h>
// #include <iostream>
// #include <vector>
// #include <cstring>

// // int main()
// // {
// //     if(execlp("ls","ls","-l","-a",NULL)==-1)//带p的直接写指令，无需写路径
// //     {
// //         std::cout<<"execl error"<<std::endl;
// //         return 0;
// //     }
// //     return 0;
// // }

// int main()
// {
//     std::vector<char*> argv;

//     argv.push_back(strdup("ls")); // 程序名
//     argv.push_back(strdup("-l")); // 参数-l
//     argv.push_back(strdup("-a")); // 参数-a
//     argv.push_back(nullptr);

//     if (execvp(argv[0], argv.data()) == -1)
//     {
//         std::cout<<"execl error"<<std::endl;
//         return 0;
//     }
//     return 0;
// }